package base.reflection_demo.demo_04;

import lombok.extern.slf4j.Slf4j;

import javax.swing.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *	本类用于测试反射API，利用用户输入类的全路径，找到该类所有的成员方法和成员属性
 * 原理: 由类的全路径名 -> 拿到类的Class对象
 *
 * 方法区:类加载时,代码加载进方法区,同时静态常量被加载到方法区
 * 堆区:Class对象存储的内存位置,关联了方法区那块代码空间
 * 栈区:方法被虚拟机调用时,压栈进入栈区
 *
 *	大家可以发现，类的全路径是在程序运行的时候，由用户输入的。所以虚拟机事先并不知道所要加载类的信息，
 *	这就是利用反射机制来对用户输入的类全路径来对类自身的一个自审。从而探知该类所拥有的方法和属性。通过上面代码，
 *	大家可以知道编译工具为什么能够一按点就能列出用户当前对象的属性和方法了。它是先获得用户输入对象的字符串，
 *	然后利用反射原理来对这样的类进行自审，从而列出该类的方法和属性
 *
 */
@Slf4j
public class ReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException {
        //要求用户输入类的全路径
        String clazzInfo = JOptionPane.showInputDialog(null,"输入类的全路径名:");
        printFields(clazzInfo);
        printMethods(clazzInfo);
    }

    public static void printFields(String classInfo) throws ClassNotFoundException {
        log.info("-------------------Fields--------------------");
        Class<?> clazz = Class.forName(classInfo);
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            log.info("{}", field);
        }
    }

    public static void printMethods(String classInfo) throws ClassNotFoundException {
        log.info("-------------------Methods--------------------");
        Class<?> clazz = Class.forName(classInfo);
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            log.info("{}",method);
        }
    }
}
